/*
 * Serializable.h
 *
 *  Created on: 2022年7月18日
 *      Author: wocao
 */
#include <iostream>
#include <fstream>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
using namespace std;

#ifndef SERIALIZABLE_H_
#define  SERIALIZABLE_H_

template<class T>
class Serializable {
public:
	void obj_out(const T& t,const string& path,const ios::openmode type);
	T* obj_in(const string& path,unsigned long& size);
	void operator()(const T& t,const string& path,const ios::openmode type);
	T* operator()(const string& path,unsigned long& size);
};

template<class T>
void Serializable<T>::obj_out(const T& t,const string& path,const ios::openmode type){
	T tt = t;
	ofstream ofile(path,type);
	ofile.write((char*)&tt, sizeof(tt));
	ofile.close();
}

template<class T>
T* Serializable<T>::obj_in(const string& path,unsigned long& size){
	struct stat f_stat;
	ifstream ifile(path,ios::binary|ios::in);
	stat(path.c_str(),&f_stat);
	size = f_stat.st_size/sizeof(T);
	char *buf = new char[f_stat.st_size]{0};
	int z = 0;
	while(!ifile.eof()){
		ifile.read(buf+z, 4096);
		z += ifile.gcount();
	}
	ifile.close();
	return (T*)buf;
}

template<class T>
void Serializable<T>::operator ()(const T& t,const string& path,const ios::openmode type){
	obj_out(t,path,type);
}

template<class T>
T* Serializable<T>::operator ()(const string& path,unsigned long& size){
	return obj_in(path,size);
}
#endif /* TOOLS_SERIALIZABLE_H_ */
